package messagemanager;

import FileWorks.SelfFileReadAndWrite;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.util.Date;

/** Класс для хранения сообщения
 * @author Караваев Кирилл, ID 1004
 * @version 0.1 Базовая функциональность
 */
public class JMessage implements Serializable, SelfFileReadAndWrite
{
    private String  MessageText;    //Текст сообщения
    private Date    ReceiveTime;    //Дата и время создания сообщения
    private int	    MessageType;    //Тип сообщения
    
    public JMessage()
    {
	MessageText = null; ReceiveTime = null; MessageType = -1;
    }
    /** Конструктор принимает параметры сообщения и устанавливает дату создания
     * @param Type - тип сообщения
     * @param Text - текст сообщения
     */
    public JMessage(int Type, String Text)
    {
	MessageType = Type;
	MessageText = new String(Text);
	ReceiveTime = new Date();
    }
    
    /** Получить текст сообщения */
    public String getText() {return new String(MessageText);}
    /** Изменить текст сообщения */
    public void setText(String Text) {MessageText = new String(Text);}
    
    /** Получить тип сообщения */
    public int getType() {return MessageType;}
    /** Изменить тип сообщения */
    public void setType(int Type) {MessageType = Type;}
    
    /** Получить дату и время создания сообщения */
    public Date getTime() {return new Date(ReceiveTime.getTime());}
    /** Изменить дату и время создания сообщения*/
    public void setTime(Date DT) {ReceiveTime = new Date(DT.getTime());}
    
    /** Вывести содержимое в строку */
    @Override
    public String toString()
    {
	return (MessageType + ": " + MessageText + ", " + ReceiveTime.toString());
    }
    
    /** Загрузка данных из файла
     * @param RAF открытый файл с установленным указателем
     * @return Результат загрузки из файла
     */
    public boolean readFromFile(RandomAccessFile RAF)
    {
	try
	{
	    MessageType = RAF.readInt();	    //Читаем тип сообщения
	    ReceiveTime = new Date(RAF.readLong()); //Читаем дату
	    int strlen = RAF.readInt();		    //Читаем длину сообщения
	    byte[] b = new byte[strlen];
	    RAF.read(b);			    //Читаем текст сообщения
	    MessageText = new String(b, "UTF-16");
	} catch (IOException e)
	{
	    return false;
	}
	return true;
    }
    /** Сохранение данных в файл
     * @param RAF открытый файл с установленным указателем
     * @return Результат записи в файл
     */
    public boolean writeToFile(RandomAccessFile RAF)
    {
	try
	{
	    RAF.writeInt(MessageType);		    //Первым записывается тип сообщения
	    RAF.writeLong(ReceiveTime.getTime());   //Затем время создания в виде long'а
	    byte bb[] = MessageText.getBytes("UTF-16");
	    RAF.writeInt(bb.length);	    //Затем длина сообщения
	    RAF.write(bb);	    //И, наконец, текст сообщения
	} catch (IOException e)
	{
	    return false;
	}
	return true;
    }
}
